package cn.cjxy.javaweb.servlet.request;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 *
 * ● 什么是作用域：用于在不同的Servlet之间共享数据区域，这个区域在服务器的内存中。底层的结构是一个Map对象，由键和值组成，键是String，值是Object，作用域中可以存放任意的类型。
 * ● Servlet中四个作用域：页面域page、请求域request，会话域session，上下文域ServletContext
 * ● 请求域的范围：数据只能在同一个请求中共享，请求结束或其它的请求不能访问其中的数据。
 *
 *  request与域有关的方法
 *  void setAttribute("键",Object数据)
 *  Object getAttribute("键")
 *  void removeAttribute("键")
 *
 *   转发的特点
 * 1）转发是服务器内部的行为，因此在转发时，客户端请求的地址不会发生变化，即使服务器内部已经跳转了好几次了，但是客户端访问的地址依旧不变；
 * 2）整个转发过程中，客户端从始至终只发送了一次请求；
 * 3）由于在整个转发过程中，客户端只发送了一次请求，因此请求域的数据不会失效；
 * 4）转发是服务器内部的行为，我们因此我们不需要加上项目名；例如：request.getRequestDispatcher("/demo01")
 * @author huangjie
 * @date 2025/9/29
 */
@WebServlet("/reqDemo3-1")
public class RequestDemo3 extends HttpServlet {
    /**
     * OneServlet创建一个键和值，转发到另一个TwoServlet，从TwoServlet中取出键和值，并且输出。使用转发可以将一个Servlet中的请求转到另一个Servlet中
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //往请求域中设置值
        req.setAttribute("user","zhangsan");
        //转发该请求
        req.getRequestDispatcher("/reqDemo3-2").forward(req,resp);

    }
}
